In [23]:
import leafmap
import geopandas as gpd
import rasterio
from rasterio.plot import show
import matplotlib.pyplot as plt
In [24]:
tif_file = 'C:/Users/HP/Desktop/rasters/multiespectral.tif'

Geopandas¶

In [25]:
#geojson_file = 'map.geojson'
geojson_file = 'mapBosque.geojson'
gdf = gpd.read_file(geojson_file)

gdf
gdf.plot()
plt.title("Límites del archivo GeoJSON")
plt.show()
No description has been provided for this image

Rasterio¶

In [26]:
with rasterio.open(tif_file) as src:
    # Mostrar las bandas disponibles en la imagen
    print(f"Bandas disponibles: {src.count}")

    # Leer las bandas (por ejemplo, banda 4 (roja) y banda 5 (infrarroja))
    red_band = src.read(4)
    nir_band = src.read(5)

    # Visualizar las bandas usando Rasterio
    fig, ax = plt.subplots(1, 2, figsize=(12, 6))

    # Mostrar la banda roja
    ax[0].imshow(red_band, cmap='Reds')
    ax[0].set_title("Banda Roja (Banda 4)")
    ax[0].axis('off')

    # Mostrar la banda infrarroja
    ax[1].imshow(nir_band, cmap='Blues')
    ax[1].set_title("Banda Infrarroja (Banda 5)")
    ax[1].axis('off')

    plt.show()
Bandas disponibles: 6
No description has been provided for this image

Rioxarray¶

In [27]:
import rioxarray

# Cargar una imagen multiespectral (GeoTIFF) con rioxarray
img = rioxarray.open_rasterio(tif_file)

# Ver las bandas disponibles
print(img)

# Obtener una banda específica (por ejemplo, la banda verde)
green_band = img.sel(band=1)

# Mostrar la banda
green_band.plot()
<xarray.DataArray (band: 6, y: 3722, x: 4797)> Size: 214MB
[107126604 values with dtype=uint16]
Coordinates:
  * band         (band) int32 24B 1 2 3 4 5 6
  * x            (x) float64 38kB -79.97 -79.97 -79.97 ... -79.97 -79.97 -79.97
  * y            (y) float64 30kB -2.142 -2.142 -2.142 ... -2.144 -2.144 -2.144
    spatial_ref  int32 4B 0
Attributes:
    AREA_OR_POINT:  Area
    scale_factor:   1.0
    add_offset:     0.0
    units:          ('metre', 'metre', 'metre', 'metre', 'metre', 'metre')
Out[27]:
<matplotlib.collections.QuadMesh at 0x1f859872830>
No description has been provided for this image

MapLibre¶

In [28]:
import folium
import rasterio
from folium.raster_layers import ImageOverlay
import numpy as np

img_rgb =  'C:/Users/Dell/Desktop/rasters/rgb.tif'
lat =  -2.1455209570360694
lon = -79.9776077614871


m = folium.Map(location=[lat, lon], zoom_start=14, 
               tiles='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', 
               attr='&copy; OpenStreetMap contributors')

with rasterio.open(tif_file) as src:
    red_band = src.read(1)
    green_band = src.read(2)
    blue_band = src.read(3)
    
    red_band = (red_band - red_band.min()) / (red_band.max() - red_band.min()) * 255
    green_band = (green_band - green_band.min()) / (green_band.max() - green_band.min()) * 255
    blue_band = (blue_band - blue_band.min()) / (blue_band.max() - blue_band.min()) * 255
    
    red_band = np.clip(red_band, 0, 255).astype(np.uint8)
    green_band = np.clip(green_band, 0, 255).astype(np.uint8)
    blue_band = np.clip(blue_band, 0, 255).astype(np.uint8)
    
    rgb_image = np.stack((red_band, green_band, blue_band), axis=-1)

    bounds = src.bounds

    img_overlay = ImageOverlay(
        image=rgb_image,
        bounds=[(bounds[1], bounds[0]), (bounds[3], bounds[2])],
        opacity=0.7,
    )
    img_overlay.add_to(m)


folium.GeoJson(geojson_file).add_to(m)

#m.save("mapa_bosque_prosperina_con_imagen.html")
m
Out[28]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Geemap¶

In [42]:
import geemap
import localtileserver
Map = geemap.Map()
Map.add_geojson(geojson_file)


Map.add_raster(tif_file)

Map
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
Cell In[42], line 2
      1 import geemap
----> 2 import localtileserver
      3 Map = geemap.Map()
      4 Map.add_geojson(geojson_file)

File ~\anaconda3\envs\ICD2023\lib\site-packages\localtileserver\__init__.py:3
      1 # flake8: noqa: F401
      2 from localtileserver._version import __version__
----> 3 from localtileserver.client import TileClient, get_or_create_tile_client
      4 from localtileserver.helpers import hillshade, parse_shapely, polygon_to_geojson, save_new_raster
      5 from localtileserver.report import Report

File ~\anaconda3\envs\ICD2023\lib\site-packages\localtileserver\client.py:10
      8 import rasterio
      9 import requests
---> 10 from rio_tiler.io import Reader
     12 try:
     13     import ipyleaflet

File ~\anaconda3\envs\ICD2023\lib\site-packages\rio_tiler\__init__.py:5
      1 """rio-tiler."""
      3 __version__ = "7.6.0"
----> 5 from . import (  # noqa
      6     colormap,
      7     constants,
      8     errors,
      9     expression,
     10     io,
     11     mosaic,
     12     profiles,
     13     reader,
     14     tasks,
     15     utils,
     16 )

File ~\anaconda3\envs\ICD2023\lib\site-packages\rio_tiler\constants.py:6
      3 import multiprocessing
      4 import os
----> 6 import morecantile
      7 from rasterio.crs import CRS
      9 from rio_tiler.types import BBox, ColorTuple, Indexes, NoData, NumType  # noqa

File ~\anaconda3\envs\ICD2023\lib\site-packages\morecantile\__init__.py:14
     11 __version__ = "6.2.0"
     13 from .commons import BoundingBox, Coords, Tile  # noqa
---> 14 from .defaults import TileMatrixSets, tms  # noqa
     15 from .models import TileMatrixSet

File ~\anaconda3\envs\ICD2023\lib\site-packages\morecantile\defaults.py:11
      8 import attr
     10 from morecantile.errors import InvalidIdentifier
---> 11 from morecantile.models import TileMatrixSet
     13 morecantile_tms_dir = pathlib.Path(__file__).parent.joinpath("data")
     14 tms_paths = list(pathlib.Path(morecantile_tms_dir).glob("*.json"))

File ~\anaconda3\envs\ICD2023\lib\site-packages\morecantile\models.py:9
      6 from typing import Any, Dict, Iterator, List, Literal, Optional, Sequence, Tuple, Union
      8 import pyproj
----> 9 from pydantic import (
     10     AnyHttpUrl,
     11     AnyUrl,
     12     BaseModel,
     13     Field,
     14     PrivateAttr,
     15     RootModel,
     16     field_validator,
     17     model_validator,
     18 )
     19 from pyproj.exceptions import CRSError, ProjError
     20 from typing_extensions import Annotated

File ~\anaconda3\envs\ICD2023\lib\site-packages\pydantic\__init__.py:413
    242 _dynamic_imports: 'dict[str, tuple[str, str]]' = {
    243     'dataclasses': (__spec__.parent, '__module__'),
    244     # functional validators
   (...)
    409     'GenerateSchema': (__spec__.parent, '._internal._generate_schema'),
    410 }
    411 _deprecated_dynamic_imports = {'FieldValidationInfo', 'GenerateSchema'}
--> 413 _getattr_migration = getattr_migration(__name__)
    416 def __getattr__(attr_name: str) -> object:
    417     if attr_name in _deprecated_dynamic_imports:

File ~\anaconda3\envs\ICD2023\lib\site-packages\pydantic\_migration.py:260, in getattr_migration(module)
    250 """Implement PEP 562 for objects that were either moved or removed on the migration
    251 to V2.
    252 
   (...)
    257     A callable that will raise an error if the object is not found.
    258 """
    259 # This avoids circular import with errors.py.
--> 260 from .errors import PydanticImportError
    262 def wrapper(name: str) -> object:
    263     """Raise an error if the object is not found, or warn if it was moved.
    264 
    265     In case it was moved, it still returns the object.
   (...)
    271         The object.
    272     """

File ~\anaconda3\envs\ICD2023\lib\site-packages\pydantic\errors.py:9
      6 from typing import Any, ClassVar, Literal
      8 from typing_extensions import Self
----> 9 from typing_inspection.introspection import Qualifier
     11 from pydantic._internal import _repr
     13 from ._migration import getattr_migration

File ~\anaconda3\envs\ICD2023\lib\site-packages\typing_inspection\introspection.py:14
     10 from typing import Any, Literal, NamedTuple, cast
     12 from typing_extensions import TypeAlias, assert_never, get_args, get_origin
---> 14 from . import typing_objects
     16 __all__ = (
     17     'AnnotationSource',
     18     'ForbiddenQualifier',
   (...)
     23     'is_union_origin',
     24 )
     26 if sys.version_info >= (3, 10):

File ~\anaconda3\envs\ICD2023\lib\site-packages\typing_inspection\typing_objects.py:19
     16 from typing import Any, Final
     18 import typing_extensions
---> 19 from typing_extensions import LiteralString, TypeAliasType, TypeIs, deprecated
     21 __all__ = (
     22     'DEPRECATED_ALIASES',
     23     'NoneType',
   (...)
     52     'is_unpack',
     53 )
     55 _IS_PY310 = sys.version_info[:2] == (3, 10)

ImportError: cannot import name 'TypeIs' from 'typing_extensions' (C:\Users\HP\anaconda3\envs\ICD2023\lib\site-packages\typing_extensions.py)

Leafmap¶

In [43]:
import localtileserver
map = leafmap.Map()


map.add_geojson(geojson_file)

map.add_raster(tif_file, bands=[3, 2, 1])  

map.add_markers(markers=[lat, lon], shape="marker")

map
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
Cell In[43], line 1
----> 1 import localtileserver
      2 map = leafmap.Map()
      5 map.add_geojson(geojson_file)

File ~\anaconda3\envs\ICD2023\lib\site-packages\localtileserver\__init__.py:3
      1 # flake8: noqa: F401
      2 from localtileserver._version import __version__
----> 3 from localtileserver.client import TileClient, get_or_create_tile_client
      4 from localtileserver.helpers import hillshade, parse_shapely, polygon_to_geojson, save_new_raster
      5 from localtileserver.report import Report

File ~\anaconda3\envs\ICD2023\lib\site-packages\localtileserver\client.py:10
      8 import rasterio
      9 import requests
---> 10 from rio_tiler.io import Reader
     12 try:
     13     import ipyleaflet

File ~\anaconda3\envs\ICD2023\lib\site-packages\rio_tiler\__init__.py:5
      1 """rio-tiler."""
      3 __version__ = "7.6.0"
----> 5 from . import (  # noqa
      6     colormap,
      7     constants,
      8     errors,
      9     expression,
     10     io,
     11     mosaic,
     12     profiles,
     13     reader,
     14     tasks,
     15     utils,
     16 )

File ~\anaconda3\envs\ICD2023\lib\site-packages\rio_tiler\constants.py:6
      3 import multiprocessing
      4 import os
----> 6 import morecantile
      7 from rasterio.crs import CRS
      9 from rio_tiler.types import BBox, ColorTuple, Indexes, NoData, NumType  # noqa

File ~\anaconda3\envs\ICD2023\lib\site-packages\morecantile\__init__.py:14
     11 __version__ = "6.2.0"
     13 from .commons import BoundingBox, Coords, Tile  # noqa
---> 14 from .defaults import TileMatrixSets, tms  # noqa
     15 from .models import TileMatrixSet

File ~\anaconda3\envs\ICD2023\lib\site-packages\morecantile\defaults.py:11
      8 import attr
     10 from morecantile.errors import InvalidIdentifier
---> 11 from morecantile.models import TileMatrixSet
     13 morecantile_tms_dir = pathlib.Path(__file__).parent.joinpath("data")
     14 tms_paths = list(pathlib.Path(morecantile_tms_dir).glob("*.json"))

File ~\anaconda3\envs\ICD2023\lib\site-packages\morecantile\models.py:9
      6 from typing import Any, Dict, Iterator, List, Literal, Optional, Sequence, Tuple, Union
      8 import pyproj
----> 9 from pydantic import (
     10     AnyHttpUrl,
     11     AnyUrl,
     12     BaseModel,
     13     Field,
     14     PrivateAttr,
     15     RootModel,
     16     field_validator,
     17     model_validator,
     18 )
     19 from pyproj.exceptions import CRSError, ProjError
     20 from typing_extensions import Annotated

File ~\anaconda3\envs\ICD2023\lib\site-packages\pydantic\__init__.py:413
    242 _dynamic_imports: 'dict[str, tuple[str, str]]' = {
    243     'dataclasses': (__spec__.parent, '__module__'),
    244     # functional validators
   (...)
    409     'GenerateSchema': (__spec__.parent, '._internal._generate_schema'),
    410 }
    411 _deprecated_dynamic_imports = {'FieldValidationInfo', 'GenerateSchema'}
--> 413 _getattr_migration = getattr_migration(__name__)
    416 def __getattr__(attr_name: str) -> object:
    417     if attr_name in _deprecated_dynamic_imports:

File ~\anaconda3\envs\ICD2023\lib\site-packages\pydantic\_migration.py:260, in getattr_migration(module)
    250 """Implement PEP 562 for objects that were either moved or removed on the migration
    251 to V2.
    252 
   (...)
    257     A callable that will raise an error if the object is not found.
    258 """
    259 # This avoids circular import with errors.py.
--> 260 from .errors import PydanticImportError
    262 def wrapper(name: str) -> object:
    263     """Raise an error if the object is not found, or warn if it was moved.
    264 
    265     In case it was moved, it still returns the object.
   (...)
    271         The object.
    272     """

File ~\anaconda3\envs\ICD2023\lib\site-packages\pydantic\errors.py:9
      6 from typing import Any, ClassVar, Literal
      8 from typing_extensions import Self
----> 9 from typing_inspection.introspection import Qualifier
     11 from pydantic._internal import _repr
     13 from ._migration import getattr_migration

File ~\anaconda3\envs\ICD2023\lib\site-packages\typing_inspection\introspection.py:14
     10 from typing import Any, Literal, NamedTuple, cast
     12 from typing_extensions import TypeAlias, assert_never, get_args, get_origin
---> 14 from . import typing_objects
     16 __all__ = (
     17     'AnnotationSource',
     18     'ForbiddenQualifier',
   (...)
     23     'is_union_origin',
     24 )
     26 if sys.version_info >= (3, 10):

File ~\anaconda3\envs\ICD2023\lib\site-packages\typing_inspection\typing_objects.py:19
     16 from typing import Any, Final
     18 import typing_extensions
---> 19 from typing_extensions import LiteralString, TypeAliasType, TypeIs, deprecated
     21 __all__ = (
     22     'DEPRECATED_ALIASES',
     23     'NoneType',
   (...)
     52     'is_unpack',
     53 )
     55 _IS_PY310 = sys.version_info[:2] == (3, 10)

ImportError: cannot import name 'TypeIs' from 'typing_extensions' (C:\Users\HP\anaconda3\envs\ICD2023\lib\site-packages\typing_extensions.py)
In [ ]:
with rasterio.open(tif_file) as src:
    red = src.read(4)
    nir = src.read(5)
    transform = src.transform
    crs = src.crs

# Calcular NDVI
ndvi = (nir - red) / (nir + red)

# Mostrar el NDVI
plt.imshow(ndvi, cmap='viridis')
plt.colorbar()
plt.title('NDVI')
plt.show()

# Convertir NDVI a un objeto rioxarray para agregarlo a Leafmap
ndvi_xr = rioxarray.open_rasterio(tif_file)



# Agregar el NDVI como una capa
map.add_raster(ndvi_xr, layer_name="NDVI", colormap="viridis")

map
In [ ]:
from skimage.transform import resize
with rasterio.open(tif_file) as src:
    bands = [src.read(i, out_shape=(src.height // 10, src.width // 10)) for i in range(1, src.count + 1)]
    width, height = src.height // 10, src.width // 10
    X = np.stack(bands, axis=-1).reshape((-1, len(bands)))
    
    # Obtener CRS y Transformación
    transform = src.transform
    crs = src.crs

# Apply KMeans clustering
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)
y_pred = kmeans.labels_
y_pred_full = y_pred.reshape((width, height))

# Plot the result
plt.imshow(y_pred_full, cmap='viridis')
plt.title("Clasificación No Supervisada - KMeans")
plt.show()

# Upsample y_pred_full to match the original image size
y_pred_full_upsampled = resize(y_pred_full, (src.height, src.width), order=0, mode='reflect', preserve_range=True)

# Convert y_pred_full_upsampled to an xarray.DataArray
y_pred_full_xr = rioxarray.open_rasterio(tif_file, masked=True).isel(band=0)
y_pred_full_xr.values = y_pred_full_upsampled  # Assign the upsampled classification
y_pred_full_xr.rio.write_crs(crs, inplace=True)
y_pred_full_xr.rio.write_transform(transform, inplace=True)

# Reproject the classified raster to match the prediction size
classified_raster = y_pred_full_xr.rio.reproject_match(y_pred_full_xr)

map.add_raster(classified_raster, layer_name="Clasificación KMeans", colormap="viridis")
map
In [ ]: